package thread;

/**
 * @author DBX
 * @effect 线程提供一个方法：void join（）
 *              该方法可以允许一个线程在另一个线程上等待（阻塞），直到其执行完毕后才结束
 *              等待继续后续工作 所以可以使用该方法协调线程的同步运行
 *
 *              线程的两种执行方式：
 *              同步：执行时出现先后顺序
 *              异步：线程执行时各干各的，并发本身就是异步运行的
 * @date 2021/9/1 0001 - 10:37
 */
public class JoinDemo {
    public static boolean isFinish = false;


    public static void main(String[] args) {
//        public static boolean isFinish = false;
        /*ifFinish 不能作为一个局部变量使用：
        *         java语法要求，当一个方法的局部内部类中若引用了该方法的某个局部变量时，该变量必须时final
        *          而final是不可变的，不可以二次赋值。*/
        Thread download = new Thread(){
            @Override
            public void run() {
                System.out.println("图片开始下载");
                for (int i = 0; i < 100; i++) {
                    System.out.println("下载进度"+i+"%");
                    try {
                        sleep(50);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                System.out.println("下载成功");
                isFinish = true;
            }
        };
        Thread show = new Thread(){
            @Override
            public void run() {
                System.out.println("开始显示文字。。。");
                try {
                    Thread.sleep(3000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("文字显示完毕");
                System.out.println("开始显示图片。。。");
                try {
                    System.out.println("等待图片下载");
                    download.join();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                if (!isFinish){
                    throw new RuntimeException("图片加载失败");
                }
                System.out.println("show：显示图片完毕");
            }
        };
        download.start();
        show.start();
    }
}
